iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 11
2

線上 Kotlin 練習編譯器:https://try.kotlinlang.org/

  今天要介紹的是匿名函式:lambda (讀音 lam[b]-da,[ˈlæmdə]) ,很少翻成中文。lambda 主要用於委派、匿名函式、區域函式,可將此函式當作引數傳遞或回傳值,看文字說明可能很難理解,接下來實際示範一下,就作者經驗,有部分的人一開始會很難理解 lambda 的用法,請跟著附圖一起實作吧。

  lambda 的撰寫關鍵字是 ->,一個 dash 加上大於符號,整個表達式以大括號 { } 為主體,關鍵字前方放上要傳入的參數及型態,後方則撰寫函式處理內容,如 Line: 2 所示,會由 msg 接收輸入值,到後方執行,其效果等同於 Line: 6 的 fun 寫法。當然,lambda 的用途並不僅僅是這個區別而已。

  另外下圖紅框處中也展示了多行內容的寫法供參考。另外可以發現在名稱相同的狀況下 (Line: 4, 10),會發生覆蓋情形,也就是說,依照最後宣告的 printMsg 當作執行依據,當然,在正式開發時並不會這樣使用。

https://ithelp.ithome.com.tw/upload/images/20181025/20111944NfywfWRnQt.png


  lambda 也可以傳入多個參數,sumAsumB 分別展示了不同的寫法,sumB 主要是將傳入與回傳型態提取出來在一開始指定,雖然 lambda 對於回傳型態是可以自行推斷,不過指定的好處就是避免推斷出來的型態並非預期型態,導致接續程式設計沒有考量到。

https://ithelp.ithome.com.tw/upload/images/20181025/20111944Cba3zQl3EO.png


  一開頭有提到 lambda 可以將函式以引數方式傳遞,首先我們在一個 fun process 中除了接收字串參數外,也設定一個 f 支援傳入函式,在 Line: 8 使用了兩段 println 當作示範,Line: 13, 14 是相同的結果以不同方式編寫,下圖中可以看到 Line: 2,程式進入 fun process 後,仍可執行代入的函式 f(),執行流程可參考最下方的印出結果。

https://ithelp.ithome.com.tw/upload/images/20181025/20111944hrhN6FXw9B.png


  lambda 也能運用在擴充方法上,str 是一個文字型態 String,透過宣告在 String 上擴充一個 another 方法,並且支援傳入 Int 參數,方法回傳型態為 String,方法內容則是本體 (this) + 傳入參數 (it)。這種寫法可以在 IDE 中打上任何自串型態變數時,能從編輯建議中看到 another 的蹤跡。

https://ithelp.ithome.com.tw/upload/images/20181025/20111944Q7gKeIK0eS.png


  在陣列中也有 lambda 的使用方式,Line: 4 代表將 arr 之中的每一個值以 item 代稱,接著在 -> 之後進行處理。Line: 5 的示範表示 item 並非固定命名,你可以使用任何的代稱,不過還是注意易讀及易用性的平衡。Line: 6 則介紹 it 這個關鍵字,使用 it 時就可省略前面的代稱指定,示範參照下圖:

https://ithelp.ithome.com.tw/upload/images/20181025/20111944TSvHNMQZgA.png


  lambda 的實務使用最簡單的舉例,宣告一個 arrayOf,再以此變數去看有哪些方法可以使用,你就會發現有很多應用都有使用到。

https://ithelp.ithome.com.tw/upload/images/20181025/20111944GDTekTU1tS.png

  對於一開始接觸的人可能會覺得 a -> a > 3 這堆符號到底在表達什麼很難懂,最簡單的方式是把 -> 視為分隔,前面為代稱,後方為要處理的方法,避免整段連在一起看,應該會比較好理解。

https://ithelp.ithome.com.tw/upload/images/20181025/20111944roaoB0f0RZ.png

  後面的章節也會實際運用 lambda 達成一些設計,同時預告關於 Kotlin 純程式語言的文章在明天會是最後一節,接著會再回到 Android Studio 上,今天的課程就到這邊,我們明天見!


資料參考

Lambda Expressions in Kotlin
https://www.baeldung.com/kotlin-lambda-expressions


上一篇
Day 10. Kotlin 基本物件導向
下一篇
Day 12. Kotlin 2D2E
系列文
Kotlin for Android30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言